/*************************
 * 文件名：IOT_Admin_Functionc.c
 * 描述：管理员对工程师信息及设备信息进行操作
 * 功能：
 * 1.管理员操作界面，根据用户输入执行相应功能
 * 2.向链表添加工程师信息
 * 3.显示所有工程师的信息
 * 4.删除指定的工程师信息
 * 5.添加工程师信息到链表中
 * 6.查找并显示指定的工程师信息
 * 7.修改指定的工程师信息
 * 8.清空所有工程师信息
 * 9.添加设备信息到链表中
 * 10.显示所有设备信息
 * 11.删除指定的设备信息
 * 12.查找并显示指定的设备信息
 * 13.清空所有设备信息
 * 14.修改指定的设备信息
 * 15.进行冒泡排序
 * 16.修改管理员密码
 * 17.修改工程师账号密码
 * 创建人：IOT_王旭
 * 创建时间：2024/9/21/18点31分
 ************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "IOT_PI_Menu.h"        // 系统菜单函数声明
#include "IOT_Admin_Function.h" // 管理员功能函数声明
#include "IOT_AdminFile.h"      // 文件操作函数声明
#include "IOT_AccPassword.h"    // 账号密码操作函数声明

/*********************宏定义*****************/
#define ENGINEER_ADD 1      // 添加工程师信息
#define ENGINEER_SHOW 2     // 显示工程师信息
#define ENGINEER_DEL 3      // 删除工程师信息
#define ENGINEER_FIND 4     // 查找工程师信息
#define ENGINEER_REVISE 5   // 修改工程师信息
#define ENGINEER_CLEAN 6    // 清空工程师信息
#define ADMIN_MESSAGE 7     // 修改管理员信息
#define ADMIN_EXIT 9        // 返回主界面
#define EQUIPMENT_ADD 10    // 添加设备信息
#define EQUIPMENT_SHOW 11   // 显示设备信息
#define EQUIPMENT_DEL 12    // 删除设备信息
#define EQUIPMENT_FIND 13   // 查找设备信息
#define EQUIPMENT_REVISE 14 // 修改设备信息
#define EQUIPMENT_CLEAN 15  // 清空设备信息
#define AWAY_ADMIN 16       // 退出系统

/*****************************************
 函数名称:IOT_Admin_Function
 描述:管理员操作界面，根据用户输入执行相应功能
 参数:LinkList Head - 链表头指针，EquipmentLink Arm - 设备链表头指针
 返回值:无
 已完成
 ******************************************/
void IOT_Admin_Function(LinkList Head, EquipmentLink Arm) // LinkList Head
{
     char choice[20]; // 存储用户选择的字符串
     int value;       // 存储用户选择的整数值
     int result = -1; // 用于接收函数返回值
     int value_jude;  // 用于判断用户输入的整数值

     while (1)
     {
          system("cls");
          IOT_Admin_Menu(); // 显示管理员菜单

          printf("请输入你的选择:\n");
          fflush(stdin);
          scanf("%19s", choice);

          value_jude = atoi(choice); // 字符串转整数
          if (value_jude > 7 && value_jude < 17)
          {
               value_jude += 999; // 调整数值范围
               sprintf(choice, "%d", value_jude);
          }

          if (choice[0] == '0')
          {
               value = atoi(choice) + 9;
          }
          else
          {
               value = atoi(choice);
          }
          switch (value)
          {

          case ENGINEER_ADD: // 1  添加工程师信息
               IOT_AddEngineer(Head);
               break;

          case ENGINEER_SHOW: // 2   显示工程师
               IOT_ShowEngineer(Head);
               break;

          case ENGINEER_DEL: // 3   删除工程师
               IOT_DelEngineer(Head);
               break;

          case ENGINEER_FIND: // 4   查找工程师
               IOT_FindEngineer(Head);
               break;

          case ENGINEER_REVISE: // 5   修改工程师
               IOT_ReviseEngineer(Head);
               break;

          case ENGINEER_CLEAN: // 6 清空工程师信息
               IOT_ClearEngineer(Head);
               break;

          case ADMIN_MESSAGE: // 7修改管理员信息
               IOT_RevisePassword(Head);
               break;

          case ADMIN_EXIT: // 00 返回主界面
               return;
               break;

          case EQUIPMENT_ADD: // 01 添加设备信息
               IOT_EquipmentAddLink(Arm);
               break;

          case EQUIPMENT_SHOW: // 02显示设备信息
               IOT_EquipmentShowLink(Arm);
               break;

          case EQUIPMENT_DEL: // 03   删除设备信息
               IOT_EquipmentDelLink(Arm);
               break;

          case EQUIPMENT_FIND: // 04  查找设备信息
               IOT_EquipmentFindLink(Arm);
               break;

          case EQUIPMENT_REVISE: // 05 修改设备信息
               IOT_EquipmentReviseLink(Arm);
               break;

          case EQUIPMENT_CLEAN: // 06 清空设备信息

               IOT_EquipmentClearLink(Arm);
               break;

          case AWAY_ADMIN: // 07 退出系统
               IOT_AExit();
               break;

          default:
               printf("输入错误请重新输入\n");
               break;
          }

          system("pause"); // 暂停
          system("cls");   // 清空界面

     } // 循环结束点
}
/********************************************工程师信息管理***********************************************/
/*************************
 函数名称:IOT_InitLinkList
 描述:初始化链表头节点
 参数:LinkList* Head - 链表头指针
 返回值:无
 已完成
 ***************************/
int IOT_InitLinkList(LinkList *Head)
{

     *Head = (LinkList)malloc(sizeof(Engineer)); // 动态分配内存

     if (NULL == *Head)
     {
          printf("链表创建空间失败！！！\n");
          exit(ERROR);
     }

     (*Head)->next = NULL; // 初始化指针
     return OK;
}

/******************************
 函数名称:IOT_AddEngineer
 描述:向链表添加工程师信息
 参数:LinkList Head - 链表头指针
 返回值:无
 已完成
 ****************************/
int IOT_AddEngineer(LinkList Head)
{
     LinkList q, p;
     LinkList w = Head->next; // 指向链表第一个元素

     char temp_ID[20] = {0};  // 临时存储工程师工号
     char temp_tel[20] = {0}; // 临时存储工程师电话

     p = (LinkList)malloc(sizeof(Engineer));

     if (NULL == p) // 内存分配失败
     {
          printf("P链表创建空间失败\n");
          exit(ERROR);
     }

     p->next = NULL; // 初始化指针

     printf("请输入该工程师的工号:");
     fflush(stdin);
     scanf("%s", temp_ID);

     while (w != NULL) // 检查工号是否已存在
     {
          if (0 == strcmp(temp_ID, w->ID))
          {
               printf("工程师工号重复，请重新输入！！！");
               return ERROR;
          }
          w = w->next;
     }
     strcpy(p->ID, temp_ID);

     printf("请输入工程师的名字:");
     fflush(stdin);
     scanf("%s", p->name);

     printf("请输入工程师的电话:");
     fflush(stdin);
     scanf("%s", temp_tel);

     w = Head->next; // 重新初始化，在工号检查时已经把链表遍历了一遍，w 被放到链表尾去了

     while (w != NULL) // 检查电话是否已存在
     {
          if (0 == strcmp(temp_tel, w->tel))
          {
               printf("工程师电话重复，请重新输入！！！");
               return ERROR;
          }
          w = w->next;
     }
     strcpy(p->tel, temp_tel);

     printf("请输入工程师的密码:");
     fflush(stdin);
     scanf("%s", p->password);

     printf("请输入工程师的检修次数:");
     fflush(stdin);
     scanf("%d", &(p->times));

     printf("-------------------------------------请确认信息------------------------------------- \n");
     printf("工号\t\t姓名\t\t电话\t\t密码\t\t检修次数\n");
     printf("%-16s", p->ID);
     printf("%-16s", p->name);
     printf("%-16s", p->tel);
     printf("%-16s", p->password);
     printf("%d\n", p->times);

     if (Head->next->next == NULL)
     {
          Head->next->next = p; // 指向第一个结点
     }
     else
     {
          q = Head;

          while (q->next != NULL)
          {
               q = q->next;
          }
          q->next = p;
     }
     IOT_Engineer_FileWrite(Head, "Engineer"); // 将更新后的信息写入文件
     return OK;
}

/*************************
 函数名称:compareEngineersBytimes(Engineer* p, Engineer* q)
 描述:比较两个工程师的检修次数
 参数:Engineer* p, Engineer* q
 返回值:返回q->times - p->times的值
 *************************/
int compareEngineersBytimes(Engineer *p, Engineer *q)
{
     if (p == NULL || q == NULL)
     {
          return 0;
     }
     return q->times - p->times;
}

/*************************
 函数名称:swapNodes(Engineer* a, Engineer* b)
 描述:交换两个工程师节点的位置
 参数:Engineer* a, Engineer* b
 返回值:无
 *************************/
void swapNodes(Engineer *a, Engineer *b)
{
     Engineer temp = *a;
     *a = *b;
     *b = temp;
     Engineer *tempNext = a->next; // 交换next结点的位置
     a->next = b->next;
     b->next = tempNext;
}

/*************************
 函数名称:sortEngineersFromSecond(LinkList* start)
 描述:从第二个节点开始对链表进行冒泡排序
 参数:LinkList* start
 返回值:无
 *************************/
void sortEngineersFromSecond(LinkList *start) // 从第2个结点开始排序，第一个结点存储管理员账号密码
{

     if (*start == NULL || (*start)->next == NULL) // 判断头结点和第一个结点是否为空
          return;
     int swapped; // 判断是否进行交换
     LinkList current;
     LinkList last = NULL; // 定义排序完后最后一个结点

     do
     {
          swapped = 0;
          current = *start;

          while (current != NULL && current->next != last)
          {
               if (compareEngineersBytimes(current, current->next) > 0)
               {
                    swapNodes(current, current->next);
                    swapped = 1;
               }
               else
               {
                    current = current->next;
               }
          }
          last = current;

     } while (swapped);
}
/*************************************
函数名称：IOT_ShowEngineer(LinkList Head)
描述：显示所有工程师的信息
参数：LinkList Head
返回值：OK 或 ERROR
*************************************/
int IOT_ShowEngineer(LinkList Head)
{
     IOT_Engineer_FileRead(Head, "Engineer"); // 读取文件
     LinkList p = Head->next->next;

     if (p == NULL)
     {
          printf("暂未添加工程师！！！");
          return ERROR;
     }
     if (p->next != NULL) // 当第2个结点不为空的时候才进行排序操作
     {
          sortEngineersFromSecond(&p);
     }

     printf("-------------------------------------工程师信息如下------------------------------------- \n");
     printf("工号\t\t姓名\t\t电话\t\t密码\t\t检修次数\n");
     printf("\n");

     while (p != NULL) // 寻找链表中的最后一个节点
     {
          printf("%-16s", p->ID);
          printf("%-16s", p->name);
          printf("%-16s", p->tel);
          printf("%-16s", p->password);
          printf("%d\n", p->times);

          p = p->next;
     }
     return OK;
}

/*************************************
函数名称：IOT_DelEngineer(LinkList Head)
描述：删除指定的工程师信息
参数：LinkList Head
返回值：OK 或 ERROR
*************************************/
int IOT_DelEngineer(LinkList Head)
{
     LinkList p = Head->next->next;
     LinkList q = Head->next;
     char ID[20] = {0};

     if (p == NULL)
     {
          printf("未添加工程师信息！！！");
          return ERROR;
     }
     printf("请输入你要删除的工程师工号:");
     fflush(stdin);
     scanf("%s", ID);

     while (p != NULL) // 寻找链表中的最后一个节点
     {
          if (0 == strcmp(ID, p->ID))
          {
               q->next = p->next;
               free(p);
               printf("删除成功！！！");
               IOT_Engineer_FileWrite(Head, "Engineer");
               return OK;
          }

          q = p;
          p = p->next;
     }
     printf("查无此人！！！");
     return ERROR;
}

/*************************************
函数名称：IOT_FindEngineer(LinkList Head)
描述：查找并显示指定的工程师信息
参数：LinkList Head
返回值：OK 或 ERROR
*************************************/
int IOT_FindEngineer(LinkList Head)
{
     LinkList p = Head->next->next;
     LinkList q = Head;
     char ID[20] = {0};

     if (p == NULL)
     {
          printf("未添加工程师信息！！！");
          return ERROR;
     }
     printf("请输入你要查找的工程师工号:");
     fflush(stdin);
     scanf("%s", ID);

     while (p != NULL) // 寻找链表中的最后一个节点
     {
          if (0 == strcmp(ID, p->ID))
          {
               printf("-------------------------------------工程师信息如下------------------------------------- \n");
               printf("工号\t\t姓名\t\t电话\t\t密码\t\t检修次数\n");
               printf("%-16s", p->ID);
               printf("%-16s", p->name);
               printf("%-16s", p->tel);
               printf("%-16s", p->password);
               printf("%d\n", p->times);
               return OK;
          }

          p = p->next;
     }
     printf("查无此人！！！");
     return ERROR;
}

/*************************************
函数名称：IOT_ReviseEngineer(LinkList Head)
描述：修改指定的工程师信息
参数：LinkList Head
返回值：OK 或 ERROR
*************************************/

int IOT_ReviseEngineer(LinkList Head)
{
     LinkList p = Head->next->next;
     LinkList w = Head->next->next;

     char ID[20] = {0};

     if (p == NULL)
     {
          printf("未添加联系人！！！");
          return ERROR;
     }
     printf("请输入你要修改的工程师工号:");
     scanf("%s", ID);

     while (p != NULL) // 寻找链表中的最后一个节点
     {
          char temp_ID[20] = {0};
          char temp_tel[20] = {0};
          if (0 == strcmp(ID, p->ID))
          {
               printf("请输入该工程师的工号:");
               fflush(stdin);
               scanf("%s", temp_ID);

               while (w != NULL) // 寻找链表中的最后一个节点
               {
                    if (0 == strcmp(temp_ID, w->ID))
                    {
                         printf("工程师工号重复，请重新输入！！！");
                         return ERROR;
                    }
                    w = w->next;
               }
               strcpy(p->ID, temp_ID);

               printf("请输入该工程师的名字:");
               fflush(stdin);
               scanf("%s", p->name);

               printf("请输入该工程师的电话:");
               fflush(stdin);
               scanf("%s", temp_tel);

               if (0 == strcmp(temp_tel, p->tel))
               {
                    printf("工程师电话重复，请重新输入！！！");
                    return ERROR;
               }
               strcpy(p->tel, temp_tel);

               printf("请输入该工程师的密码:");
               fflush(stdin);
               scanf("%s", p->password);

               printf("请输入该工程师的检修次数:");
               fflush(stdin);
               scanf("%d", &(p->times));

               printf("-------------------------------------请确认信息------------------------------------ \n");
               printf("工号\t\t姓名\t\t电话\t\t密码\t\t检修次数\n");
               printf("%-16s", p->ID);
               printf("%-16s", p->name);
               printf("%-16s", p->tel);
               printf("%-16s", p->password);
               printf("%d\n", p->times);
               IOT_Engineer_FileWrite(Head, "Engineer");
               return OK;
          }

          p = p->next;
     }

     printf("查无此人！！！");
}

/*************************************
函数名称：IOT_ClearEngineer(LinkList Head)
描述：清空所有工程师信息
参数：LinkList Head - 链表头节点
返回值：OK 或 ERROR
*************************************/
int IOT_ClearEngineer(LinkList Head)
{
     LinkList p = Head->next->next;
     LinkList q = Head->next;
     if (p == NULL)
     {
          printf("未添加联系人！！！");
          return ERROR;
     }
     while (p != NULL)
     {
          q->next = p->next;
          free(p);
          p = q->next;
     }
     printf("清空成功！！！");
     IOT_Engineer_FileWrite(Head, "Engineer");
     return OK;
}

/****************************************设备信息管理******************************************************************************************************************/
/*************************************
 函数名称:IOT_EquipmentInitLink(EquipmentLink *Arm)
 描述:创建头节点
 参数:EquipmentLink Arm
 返回值:OK 或 ERROR
 *************************************/
int IOT_EquipmentInitLink(EquipmentLink *Arm)
{

     *Arm = (EquipmentLink)malloc(sizeof(Equipment));

     if (NULL == *Arm)
     {
          printf("链表创建空间失败！！！\n");
          exit(ERROR);
     }

     (*Arm)->next = NULL;

     return OK;
}

/*************************************
函数名称：IOT_EquipmentAddLink(EquipmentLink *Arm)
描述：添加设备信息到链表中
参数：EquipmentLink Arm
返回值：OK 或 ERROR
*************************************/
int IOT_EquipmentAddLink(EquipmentLink Arm)
{
     EquipmentLink q, p;
     EquipmentLink w = Arm->next;

     char temp_ID[20] = {0};
     char temp_number[20] = {0};
     char input[20] = {0};
     char TrueEquipment[] = "设备已检修"; // 1
     char ERROREquipment[] = "设备故障";
     char OtherEquipment[] = "正在检修中";

     p = (EquipmentLink)malloc(sizeof(Equipment));

     if (NULL == p)
     {
          printf("P链表创建空间失败\n");
          exit(ERROR);
     }

     p->next = NULL;

     printf("请输入该设备的型号:");
     fflush(stdin);
     scanf("%s", temp_ID);

     while (w != NULL)
     {
          if (0 == strcmp(temp_ID, w->ID))
          {
               printf("设备型号重复，请重新输入！！！");
               return ERROR;
          }
          w = w->next;
     }
     strcpy(p->ID, temp_ID);

     printf("请输入该设备的安装地点:");
     fflush(stdin);
     scanf("%s", p->gps);

     printf("请输入该设备的状态(1为设备已检修/2为设备故障/3为正在检修中):");
     fflush(stdin);
     scanf("%s", input);
     if (0 == strcmp(input, "1"))
     {
          strcpy(p->state, TrueEquipment);
     }
     else if (0 == strcmp(input, "2"))
     {
          strcpy(p->state, ERROREquipment);
     }
     else if (0 == strcmp(input, "3"))
     {
          strcpy(p->state, OtherEquipment);
     }
     else
     {
          printf("输入错误，请重新输入！！！");
          return ERROR;
     }

     printf("请输入该设备的历史检修次数:");
     fflush(stdin);
     scanf("%d", &(p->count));

     printf("请输入该设备的检修日期:");
     fflush(stdin);
     scanf("%s", p->data);

     printf("------------------------------------------请确认信息----------------------------------------- \n");
     printf("\n");
     printf("设备型号\t设备安装地点\t\t设备状态\t\t历史检修次数\t\t检修日期\n");
     printf("%-16s", p->ID);
     printf("%-24s", p->gps);
     printf("%-24s", p->state);
     printf("%-24d", p->count);
     printf("%-20s\n", p->data);

     if (Arm->next == NULL)
     {
          Arm->next = p; // 指向第一个结点
     }
     else
     {
          q = Arm;

          while (q->next != NULL)
          {
               q = q->next;
          }
          q->next = p;
     }
     IOT_Equipment_FileWrite(Arm, "Equipment"); // 文件
     return OK;
}

/*************************************
函数名称：compareEquipmentsBycount(Equipment* p, Equipment* q)
描述：比较两个设备节点的检修次数
参数：Equipment* p ，Equipment* q
返回值：p->count - q->count
*************************************/
int compareEquipmentsBycount(Equipment *p, Equipment *q)
{
     if (p == NULL || q == NULL)
     {
          return 0;
     }
     return q->count - p->count;
}

/*************************************
函数名称：swapEqusNodes(Equipment* a, Equipment* b)
描述：交换两个设备节点的位置
参数：Equipment* a ，Equipment* b
返回值：无
*************************************/
void swapEqusNodes(Equipment *a, Equipment *b)
{
     Equipment temp = *a;
     *a = *b;
     *b = temp;
     Equipment *tempNext = a->next; // 交换next结点的位置
     a->next = b->next;
     b->next = tempNext;
}

/*************************************
函数名称：sortEquipmentsFromSecond(EquipmentLink* start)
描述：从第二个节点开始对设备链表进行冒泡排序
参数：EquipmentLink* start - 设备链表头节点指针
返回值：无
*************************************/
void sortEquipmentsFromSecond(EquipmentLink *start) // 从第2个结点开始排序，第一个结点存储管理员账号密码
{

     if (*start == NULL || (*start)->next == NULL) // 判断头结点和第一个结点是否为空
          return;
     int swapped; // 判断是否进行交换
     EquipmentLink current;
     EquipmentLink last = NULL; // 定义排序完后最后一个结点

     do
     {
          swapped = 0;
          current = *start;

          while (current != NULL && current->next != last)
          {
               if (compareEquipmentsBycount(current, current->next) > 0)
               {
                    swapEqusNodes(current, current->next);
                    swapped = 1;
               }
               else
               {
                    current = current->next;
               }
          }
          last = current;

     } while (swapped);
}

/*************************************
函数名称：IOT_EquipmentShowLink(EquipmentLink Arm)
描述：显示所有设备信息
参数：EquipmentLink Arm - 设备链表头节点
返回值：OK 或 ERROR
*************************************/
int IOT_EquipmentShowLink(EquipmentLink Arm)
{
     IOT_Equipment_FileRead(Arm, "Equipment"); // 文件
     EquipmentLink p = Arm->next;

     if (p == NULL)
     {
          printf("未添加设备！！！");
          return ERROR;
     }
     sortEquipmentsFromSecond(&p);
     printf("----------------------------------------设备信息如下-------------------------------------------- \n");
     printf("\n");
     printf("设备型号\t设备安装地点\t\t设备状态\t\t历史检修次数\t\t检修日期\n");
     printf("\n");
     while (p != NULL) // 寻找链表中的最后一个节点
     {
          printf("%-16s", p->ID);
          printf("%-24s", p->gps);
          printf("%-24s", p->state);
          printf("%-24d", p->count);
          printf("%-20s\n", p->data);
          p = p->next;
     }
     return OK;
}

/*************************************
函数名称：IOT_EquipmentDelLink(EquipmentLink Arm)
描述：删除指定的设备信息
参数：EquipmentLink Arm - 设备链表头节点
返回值：OK 或 ERROR
*************************************/
int IOT_EquipmentDelLink(EquipmentLink Arm)
{
     EquipmentLink p = Arm->next;
     EquipmentLink q = Arm;
     char ID[20] = {0};

     if (p == NULL)
     {
          printf("未添加设备信息！！！");
          return ERROR;
     }
     printf("请输入你要删除的设备型号:");
     fflush(stdin);
     scanf("%s", ID);

     while (p != NULL) // 寻找链表中的最后一个节点
     {
          if (0 == strcmp(ID, p->ID))
          {
               q->next = p->next;
               free(p);
               printf("删除成功！！！");
               IOT_Equipment_FileWrite(Arm, "Equipment"); // 文件
               return OK;
          }

          q = p;
          p = p->next;
     }
     printf("查无此设备！！！");
     return ERROR;
}

/*************************************
函数名称：IOT_EquipmentFindLink(EquipmentLink Arm)
描述：查找并显示指定的设备信息
参数：EquipmentLink Arm - 设备链表头节点
返回值：OK 或 ERROR
*************************************/
int IOT_EquipmentFindLink(EquipmentLink Arm)
{
     IOT_Equipment_FileRead(Arm, "Equipment"); // 文件
     EquipmentLink p = Arm->next;
     char ID[20] = {0};

     if (p == NULL)
     {
          printf("未添加设备信息！！！");
          return ERROR;
     }
     printf("请输入你要查找的设备型号:");
     fflush(stdin);
     scanf("%s", ID);

     while (p != NULL) // 寻找链表中的最后一个节点
     {
          if (0 == strcmp(ID, p->ID))
          {
               printf("----------------------------------------设备信息如下-------------------------------------------- \n");
               printf("\n");
               printf("设备型号\t设备安装地点\t\t设备状态\t\t历史检修次数\t\t检修日期\n");
               printf("\n");
               printf("%-16s", p->ID);
               printf("%-24s", p->gps);
               printf("%-24s", p->state);
               printf("%-24d", p->count);
               printf("%-20s\n", p->data);

               return OK;
          }
          p = p->next;
     }
     printf("查无此设备！！！");
     return ERROR;
}

/*************************************
函数名称：IOT_EquipmentClearLink(EquipmentLink Arm)
描述：清空所有设备信息
参数：EquipmentLink Arm - 设备链表头节点
返回值：OK 或 ERROR
*************************************/
int IOT_EquipmentClearLink(EquipmentLink Arm)
{
     EquipmentLink p = Arm->next;
     EquipmentLink q;
     if (p == NULL)
     {
          printf("未添加设备！！！");
          return ERROR;
     }
     while (p != NULL)
     {
          q = p->next;
          free(p);
          p = q;
     }

     Arm->next = NULL;
     printf("清空成功！！！");
     IOT_Equipment_FileWrite(Arm, "Equipment"); // 文件
     return OK;
}

/*************************************
函数名称：IOT_EquipmentReviseLink(EquipmentLink Arm)
描述：修改指定的设备信息
参数：EquipmentLink Arm - 设备链表头节点
返回值：OK 或 ERROR
*************************************/
int IOT_EquipmentReviseLink(EquipmentLink Arm)
{
     EquipmentLink p = Arm->next;
     EquipmentLink x = Arm->next;
     char ID[20] = {0};
     char input[20] = {0};
     char TrueEquipment[] = "设备已检修"; // 1
     char ERROREquipment[] = "设备故障";
     char OtherEquipment[] = "正在检修中";

     if (p == NULL)
     {
          printf("未添加设备！！！");
          return ERROR;
     }
     printf("请输入你要修改的设备型号:");
     scanf("%s", ID);

     while (p != NULL) // 寻找链表中的最后一个节点
     {
          char temp_ID[20] = {0};

          if (0 == strcmp(ID, p->ID))
          {
               printf("请输入该设备的型号:");
               fflush(stdin);
               scanf("%s", temp_ID);

               while (x != NULL) // 寻找链表中的最后一个节点
               {
                    if (0 == strcmp(temp_ID, x->ID))
                    {
                         printf("设备型号重复，请重新输入！！！");
                         return ERROR;
                    }
                    x = x->next;
               }
               strcpy(p->ID, temp_ID);

               printf("请输入该设备的安装地点:");
               fflush(stdin);
               scanf("%s", p->gps);

               printf("请输入该设备的状态:(1为设备已检修/2为设备故障/3为正在检修中)\n");
               fflush(stdin);
               scanf("%s", input);
               if (0 == strcmp(input, "1"))
               {
                    strcpy(p->state, TrueEquipment);
               }
               else if (0 == strcmp(input, "2"))
               {
                    strcpy(p->state, ERROREquipment);
               }
               else if (0 == strcmp(input, "3"))
               {
                    strcpy(p->state, OtherEquipment);
               }
               else
               {
                    printf("输入错误，请重新输入！！！");
                    return ERROR;
               }

               printf("请输入该设备历史检修次数:");
               fflush(stdin);
               scanf("%d", &(p->count));

               printf("请输入该设备检修日期:");
               fflush(stdin);
               scanf("%s", p->data);

               printf("------------------------------------------请确认信息----------------------------------------- \n");
               printf("设备型号\t设备安装地点\t\t设备状态\t\t历史检修次数\t\t检修日期\n");
               printf("\n");
               printf("%-16s", p->ID);
               printf("%-24s", p->gps);
               printf("%-24s", p->state);
               printf("%-24d", p->count);
               printf("%-20s\n", p->data);

               IOT_Equipment_FileWrite(Arm, "Equipment"); // 文件
               return OK;
          }

          p = p->next;
     }

     printf("查无此设备！！！");
}

/************************
函数名称：  IOT_AExit
描述：  退出程序
返回值：无
ps:完成
***************************/
void IOT_AExit()
{
     exit(0);
}